/*
 * @(#)BaseEnityDao.java
 *
 * Copyright 2012 by ShenY BIS, All rights reserved.
 */

package com.bis.framework.base.dao;

import java.util.List;
import java.util.Map;

import org.springframework.dao.DataAccessException;

import com.bis.framework.base.entity.BaseEntity;
import com.bis.framework.util.common.Page;
import com.bis.framework.util.common.PageData;

/**
 * Base Entity DAO
 * 
 * @author BIS 2012-12-24
 */
public interface BaseEnityDao<T> extends Dao
{

    /**
     * 1.根据给定的实体类保存到数据库中。
     * @Description:
     * @param entity
     * @throws DataAccessException
     */
    void insertEntity(T entity) throws DataAccessException;

    /**
     * 2.根据给定的实体类保存到数据库中，并返回主键ID。
     * @Description:
     * @param entity
     * @return
     * @throws DataAccessException
     */
    public Long insertEntityReturnId(T entity) throws DataAccessException;

    /**
     * 3.根据给定的实体类列表保存都数据库中。
     * @Description:
     * @param entities
     * @throws DataAccessException
     */
    void insertEntity(List<T> entities) throws DataAccessException;

    /**
     * 4.根据给定的实体类查询数据列表。
     * @Description:
     * @param sourceObj
     * @return
     */
    public List<T> selectByEntity(BaseEntity sourceObj);

    /**
     * 5.根据给定的主键查询数据。
     * @Description:
     * @param key
     * @return
     * @throws DataAccessException
     */
    T selectByPrimaryKey(Object key) throws DataAccessException;
    
    
    /**
     * 6.根据给定的条件列表查询数据列表。
     * @Description:
     * @param map
     * @return
     * @throws DataAccessException
     */
    List<T> selectByMap(Map<String, Object> map) throws DataAccessException;

    /**
     * 7.根据给定的条件列表查询分页数据。
     * @Description:
     * @param map
     * @param page
     * @return
     * @throws DataAccessException
     */
    PageData selectByMap(Map map, Page page) throws DataAccessException;
    
    /**
     * 8.根据给定的条件列表，查询数据总数。
     * @Description:
     * @param conditionMap
     * @return
     * @throws DataAccessException
     */
    public int selectCountByMap(Map<String, Object> conditionMap) throws DataAccessException;
    
    /**
     * 9.根据给定的实体类更新数据库。
     * @Description:
     * @param entity
     * @throws DataAccessException
     */
    void updateEntity(T entity) throws DataAccessException;

    /**
     * 10.根据给定的实体类列表更新数据库。
     * @Description:
     * @param entities
     * @throws DataAccessException
     */
    public void updateEntity(final List<T> entities) throws DataAccessException;

    /**
     * 11.根据给定的主键删除数据。
     * @Description:
     * @param key
     * @throws DataAccessException
     */
    void deleteByPrimaryKey(Object key) throws DataAccessException;

    /**
     * 12.根据给定的主键列表删除数据。
     * @Description:
     * @param keys
     * @throws DataAccessException
     */
    void deleteByPrimaryKey(List keys) throws DataAccessException;

    /**
     * 13.根据给定的条件列表对数据进行删除处理。
     * @Description:
     * @param map
     * @throws DataAccessException
     */
    void deleteByMap(Map map) throws DataAccessException;

}
